Skip to content

feat(experiments): metric breakdown ui persist attribution - #86544

Merged
trunk-io[bot] merged 2 commits into
experiments/metric-breakdown-ui-persist-limit-changefrom
experiments/metric-breakdown-ui-persist-attribution
Aug 21, 2026
Merged

trunk-io[bot] merged 2 commits into
experiments/metric-breakdown-ui-persist-limit-changefrom
experiments/metric-breakdown-ui-persist-attribution

Conversation

@rodrigoi

@rodrigoi rodrigoi commented Aug 20, 2026 •

Copy link
Copy Markdown
Member

Problem

Experiment metric breakdowns currently attribute the breakdown value from the exposure event. That differs from insights funnels, where the breakdown is read from funnel events with a configurable attribution mode, and it produces null buckets whenever the exposure event doesn't carry the property.

Changes

We replace the no-op with a callback handled at the top level by MetricsTable. This callback calls an action that updates the experiment state with the updated metric information. For shared metrics, the breakdown attribution information is stored on the experiment relationship's metadata.

Utility functions where updated to handle the metadata change. Also the private ExperimentSharedMetric type was updated.

How did you test this code?

👉 Stay up-to-date with PostHog coding conventions for a smoother review.

cat-type-small

Automatic notifications

  • Publish to changelog?

Docs update

🤖 Agent context

Good old-fashioned handwritten code.

@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane

This PR is assigned to the backend Python lane. It runs backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Bundle size — 🔺 +1.8 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 68.64 MiB · 🔺 +1.8 KiB (+0.0%)

File Size Δ vs base
render-query/src/render-query/render-query.js 21.89 MiB 🔺 +1.5 KiB (+0.0%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.35 MiB · 22 files no change ███░░░░░░░ 30.0% of 4.51 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
8.74 MiB · 3,229 files 🔺 +352 B (+0.0%) █████████░ 90.0% of 9.71 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
789 B src/scenes/ChunkLoadErrorBoundary.tsx
762 B src/index.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
304.7 KiB ../node_modules/.pnpm/posthog-js@1.418.5/node_modules/posthog-js/dist/rrweb.js
267.7 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
250.7 KiB ../node_modules/.pnpm/posthog-js@1.418.5/node_modules/posthog-js/dist/module.js
246.9 KiB src/taxonomy/core-filter-definitions-by-group.json
154.2 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
104.4 KiB src/lib/api.ts
95.1 KiB ../packages/quill/packages/quill/dist/index.js
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.24 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.24 MiB · 17 files no change ████░░░░░░ 39.1% of 5.72 MiB
Deferred (lazy) 2.09 MiB · 33 files no change n/a — loads on demand
Loader dist/toolbar.js 1.1 KiB no change █░░░░░░░░░ 5.8% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
743.3 KiB dist/toolbar/toolbar-app-EHNBTBYS.css
574.4 KiB dist/toolbar/chunk-chunk-NC7XRMLK.js
484.6 KiB dist/toolbar/chunk-chunk-MNRHA3FG.js
133.6 KiB dist/toolbar/chunk-chunk-UGHM3P74.js
131.8 KiB dist/toolbar/chunk-chunk-T5KY5WYR.js
71.2 KiB dist/toolbar/toolbar-app-2QKZZDZ7.js
69.0 KiB dist/toolbar/chunk-chunk-27JL52RE.js
35.6 KiB dist/toolbar/chunk-chunk-QTS66TKD.js
20.9 KiB dist/toolbar/chunk-chunk-JATT64WN.js
12.2 KiB dist/toolbar/chunk-chunk-PIK3PADE.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +35.2 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1464.88 MiB · 🔺 +35.2 KiB (+0.0%)

✅ Playwright — all passed

All tests passed.

View test results →

@rodrigoi rodrigoi added skip-inkeep-docs Use this label to skip an Inkeep docs PR in posthog.com reviewhog labels Aug 20, 2026
@rodrigoi rodrigoi changed the title experiments/metric breakdown ui persist attribution feat(experiments): metric breakdown ui persist attribution Aug 20, 2026
@rodrigoi
rodrigoi marked this pull request as ready for review August 20, 2026 15:09
@github-actions

github-actions Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit bb640ff · box box-cf196cd760e8 · ready in 765s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested a review from a team August 20, 2026 15:10
@greptile-apps

greptile-apps Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor
Prompt To Fix All With AI
### Issue 1
frontend/src/scenes/experiments/MetricBreakdowns/MetricBreakdownAttribution.tsx:27-30
**Unordered attribution retains invalid step**

When an ordered funnel with a specific attribution step is changed to unordered, this branch displays “Any step” but retains the nonzero `breakdownAttributionValue`, causing the post-save result refresh to fail backend validation.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(experiments): persist breakdown att..." | Re-trigger Greptile

@trunk-io

trunk-io Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

View Full Report ↗︎ ⋅ Docs

@rodrigoi
rodrigoi force-pushed the experiments/metric-breakdown-ui-persist-attribution branch from 609cab9 to 97587b0 Compare August 20, 2026 16:08
@rodrigoi rodrigoi added the stamphog Request AI approval (no full review) label Aug 20, 2026
@stamphog

This comment was marked as resolved.

@stamphog stamphog Bot removed the stamphog Request AI approval (no full review) label Aug 20, 2026
@trunk-io

trunk-io Bot commented Aug 20, 2026 •

Copy link
Copy Markdown

😎 Stack merged successfully - details.

@rodrigoi
rodrigoi force-pushed the experiments/metric-breakdown-ui-persist-attribution branch from 97587b0 to 08bfae5 Compare August 20, 2026 19:30
@github-actions
github-actions Bot requested a deployment to preview-pr-86544 August 20, 2026 19:31 In progress
@trunk-io
trunk-io Bot merged commit c722109 into master Aug 21, 2026
228 of 384 checks passed
@trunk-io
trunk-io Bot deleted the experiments/metric-breakdown-ui-persist-attribution branch August 21, 2026 14:06
@deployment-status-posthog

deployment-status-posthog Bot commented Aug 21, 2026 •

Copy link
Copy Markdown

Deploy status

Environment Status Deployed At Workflow
dev ✅ Deployed 2026-08-21 14:36 UTC Run
prod-us ✅ Deployed 2026-08-21 15:07 UTC Run
prod-eu ✅ Deployed 2026-08-21 15:05 UTC Run

This branch was successfully deployed

1 active deployment
preview-pr-86544 — bb640fff Deployed Aug 21, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-inkeep-docs Use this label to skip an Inkeep docs PR in posthog.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants